package com.kurt.service;

import com.kurt.dto.MenuDTO;
import com.kurt.dto.create.MenuCreateRequest;
import com.kurt.dto.query.MenuQueryRequest;
import com.kurt.dto.update.MenuUpdateRequest;
import com.kurt.entity.SysMenu;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 菜单服务接口
 * 提供菜单相关的业务逻辑方法
 */
public interface MenuService extends BaseService<SysMenu, Long> {

    /**
     * 创建菜单
     *
     * @param createRequest 创建请求
     * @return 菜单信息
     */
    MenuDTO createMenu(MenuCreateRequest createRequest);

    /**
     * 更新菜单
     *
     * @param updateRequest 更新请求
     * @return 菜单信息
     */
    MenuDTO updateMenu(MenuUpdateRequest updateRequest);

    /**
     * 根据ID获取菜单详情
     *
     * @param id 菜单ID
     * @return 菜单信息
     */
    MenuDTO getMenuById(Long id);

    /**
     * 分页查询菜单
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    Page<MenuDTO> getMenuPage(MenuQueryRequest queryRequest);

    /**
     * 根据条件查询菜单列表
     *
     * @param queryRequest 查询请求
     * @return 菜单列表
     */
    List<MenuDTO> getMenuList(MenuQueryRequest queryRequest);

    /**
     * 删除菜单
     *
     * @param id 菜单ID
     * @return 是否成功
     */
    boolean deleteMenu(Long id);

    /**
     * 批量删除菜单
     *
     * @param ids 菜单ID列表
     * @return 是否成功
     */
    boolean deleteMenus(List<Long> ids);

    /**
     * 获取菜单树
     *
     * @param parentId 父菜单ID
     * @return 菜单树
     */
    List<MenuDTO> getMenuTree(Long parentId);

    /**
     * 获取所有菜单树
     *
     * @return 菜单树
     */
    List<MenuDTO> getAllMenuTree();

    /**
     * 根据父菜单ID获取子菜单列表
     *
     * @param parentId 父菜单ID
     * @return 子菜单列表
     */
    List<MenuDTO> getChildrenByParentId(Long parentId);

    /**
     * 根据用户ID获取用户菜单权限
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<MenuDTO> getMenusByUserId(Long userId);

    /**
     * 根据角色ID获取角色菜单权限
     *
     * @param roleId 角色ID
     * @return 菜单列表
     */
    List<MenuDTO> getMenusByRoleId(Long roleId);

    /**
     * 检查菜单名称是否存在
     *
     * @param name 菜单名称
     * @return 是否存在
     */
    boolean existsByName(String name);

    /**
     * 检查菜单名称是否存在（排除指定ID）
     *
     * @param name      菜单名称
     * @param excludeId 排除的菜单ID
     * @return 是否存在
     */
    boolean existsByNameAndIdNot(String name, Long excludeId);

    /**
     * 检查菜单编码是否存在
     *
     * @param code 菜单编码
     * @return 是否存在
     */
    boolean existsByCode(String code);

    /**
     * 检查菜单编码是否存在（排除指定ID）
     *
     * @param code      菜单编码
     * @param excludeId 排除的菜单ID
     * @return 是否存在
     */
    boolean existsByCodeAndIdNot(String code, Long excludeId);

    /**
     * 更新菜单状态
     *
     * @param id     菜单ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateStatus(Long id, Integer status);

    /**
     * 更新菜单排序
     *
     * @param id        菜单ID
     * @param sortOrder 排序号
     * @return 是否成功
     */
    boolean updateSortOrder(Long id, Integer sortOrder);

    /**
     * 移动菜单到新的父菜单下
     *
     * @param id          菜单ID
     * @param newParentId 新父菜单ID
     * @return 是否成功
     */
    boolean moveMenu(Long id, Long newParentId);
}
